package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import Clases.Producto;

public class DAOProducto
{
	private static DAOProducto pool;
	
	private DAOProducto(){
	}	
	
	public static DAOProducto getInstancia()
	{
		if (pool == null)
			return pool = new DAOProducto();
		return pool;
	}
	
	public void insert(Producto p)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();

		try
		{
			String senten = "INSERT [TPOAPI].[dbo].[Producto] (codBarra, Nombre, Proveedor, StockTotal, StockDisponible, Unidad, Activo, Precio) VALUES (?,?,?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,p.getCodBarra());
			ps.setString(2,p.getNombre());
			ps.setString(3,p.getProveedor());
			ps.setFloat(4, p.getStockTotal());
			ps.setFloat(5, p.getStockDisponible());	
			ps.setString(6, p.getUnidad());
			ps.setInt(7, p.getActivo());
			ps.setFloat(8, p.getPrecio());
			
			
			ps.execute();			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Producto: " + e.getStackTrace());
				
	      }
	      
	}
	public void update(Producto p)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {
			//Preparar sentencia insert en tabla destino
			String senten = "UPDATE [TPOAPI].[dbo].[Producto] set proveedor = ? ,stocktotal = ? , unidad = ?, nombre = ?, activo = ?, precio = ?, stockdisponible = ? where codBarra = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,p.getProveedor());
			ps.setFloat(2,p.getStockTotal());
			ps.setString(3, p.getUnidad());
			ps.setString(4,p.getNombre());
			ps.setInt(5, p.getActivo());
			ps.setFloat(6, p.getPrecio());
			ps.setFloat(7,p.getStockDisponible());
			ps.setInt(8,p.getCodBarra());
			ps.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	   catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Modificar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Modificar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
		      
	}
	public boolean delete (Producto p)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {
			//Preparar sentencia insert en tabla destino
			if(!DAOIngrediente.getInstancia().existeIngredienteRelaionado(p.getCodBarra())){
				String senten = "UPDATE [TPOAPI].[dbo].[Producto]  set Activo = ? where codBarra = ?" ;
				PreparedStatement ps = null;
				ps = con.prepareStatement(senten);
				ps.setInt(1,p.getActivo());
				ps.setInt(2, p.getCodBarra());
				ps.execute();
				PoolConnection.getPoolConnection().realeaseConnection(con);
				return true;
			}
			return false;
		}
	   catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Eliminar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Eliminar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);			
	      }
		return false;
	}
	
	public Producto buscarProducto(int codBarra)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Producto p = null;
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * from [TPOAPI].[dbo].[Producto] where codBarra = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,codBarra);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				p = new Producto();
				p.setNombre(result.getString("nombre"));
				p.setProveedor(result.getString("proveedor"));
				p.setStockTotal(result.getFloat("stocktotal"));
				p.setStockDisponible(result.getFloat("stockDisponible"));
				p.setUnidad(result.getString("unidad"));
				p.setActivo(result.getInt("activo"));
				p.setCodBarra(result.getInt("codBarra"));
				p.setPrecio(result.getFloat("precio"));
			}
		PoolConnection.getPoolConnection().realeaseConnection(con);
			return p;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return p;
	}
	
	/*
	Este buscar me permite llenar los comboBox de las pantallas! 
	Se usa para las View!
	*/
	public Vector<Producto> buscarTodosProductos()
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();	
		Vector<Producto> vec = new Vector<Producto>();
		Producto p = null;
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * from [TPOAPI].[dbo].[Producto]" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while(result.next())
			{	
				if(result.getInt("activo") == 1) {
					p = new Producto();
					p.setNombre(result.getString("nombre"));
					p.setProveedor(result.getString("proveedor"));
					p.setStockTotal(result.getFloat("stocktotal"));
					p.setStockDisponible(result.getFloat("stockDisponible"));
					p.setUnidad(result.getString("unidad"));
					p.setActivo(result.getInt("activo"));
					p.setCodBarra(result.getInt("codBarra"));
					p.setPrecio(result.getFloat("precio"));
					vec.add(p);
				}
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return vec;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return vec;
	}
	
	
	
}
